#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

// A的实现，一般会隐藏
typedef void (*CallbackPtr)(int); //函数指针定义

typedef struct parameter{
    int a ;
    CallbackPtr callback;
}parameter; 

// 创建实例
parameter ParaData;

void* callback_thread(void *p1)//此处用的是一个线程
{
    //do something
    // 循环改变p->a的值为为0 2 3 4 5 6 7 8 9 ,每隔3秒改变一次
    parameter* p = (parameter*)p1 ;
    while(1)
    {
        sleep(3);//延时3秒执行callback函数
        p->callback(p->a);//函数指针执行函数，这个函数来自于应用层B
        p->a = (p->a + 1) % 10;
    }
}

void startup_app_A()
{
    // 初始化为0
    ParaData.a = 0;
    CallbackPtr init_call_back;
    ParaData.callback = init_call_back;
     //创建线程
    pthread_t thing1;
    pthread_create(&thing1,NULL,callback_thread,(void *) &ParaData);
}

// 给B的接口，接收注册函数
extern void SetCallBackFun(CallbackPtr callback)
{
    printf("SetCallBackFun print! \n");
    ParaData.callback = callback;
}


// //-----------------------应用者B-------------------------------
void fCallBack(int a)       // 应用者增加的函数，此函数会在A中被执行
{
    //do something
    printf("B得到A的数据 = %d\n",a);
}




int main(void)
{
    // 启动A
    startup_app_A();

    SetCallBackFun(fCallBack);
    
    // 主函数
    while (1)
    {
        // std::cout << "main function" << std::endl;
        printf("main function\n");
        sleep(2);
    }

    return 0;
}





 
